﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SlideShow.Models;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
using System.Text;

namespace SlideShow.Controllers
{
    public class UsuarioController : Controller
    {

        //private List<Usuario> CrearUsuario()
        //{
        //    List<Usuario> Lista = new List<Usuario>();
        //    Lista.Add(new Usuario("edanmegu@gmail.com", "Edson", "Menéndez", "Ing. Sistemas", "Ing. de Sistemas"));
        //    Lista.Add(new Usuario("valiente@gmail.com", "Alberto", "Valiente", "Ing. Sistemas", "Ing. de Sistemas"));
        //    Lista.Add(new Usuario("garrido@gmail.com", "Cesar", "Garrido", "Ing. Sistemas", "Ing. de Sistemas"));
        //    Lista.Add(new Usuario("burga@gmail.com", "Alberto", "Burga", "Ing. Sistemas", "Ing. de Sistemas"));
        //    Lista.Add(new Usuario("lilian@gmail.com", "Lilian", "Lilian", "Ing. Sistemas", "Ing. de Sistemas"));

        //    return Lista;
        //}

        public bool validarUsuario(string email, string password)
        {
            email = email.Replace( ".","$punto$");
            Libraries.RestServiceInvoker restInvoker = new Libraries.RestServiceInvoker();
            string respuesta = restInvoker.GetMethod("http://localhost:50358/Usuario.svc/Usuarios/Validacion/"+ email + "/" + password);
            JavaScriptSerializer js = new JavaScriptSerializer();
            Usuario usuarioObtenido = js.Deserialize<Usuario>(respuesta);

            return (bool)(usuarioObtenido!=null);
        }

        private Usuario procesarLoginFacebook(string code)
        {            
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:50358/Usuario.svc/Usuarios/Facebook/" + code);
            //establecer el metodo
            req.Method = "GET";
            //Recuperar la respuesta
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            //Instanciar un lector
            StreamReader reader = new StreamReader(res.GetResponseStream());
            //Leer la cadena respondida
            string usuarioJSon = reader.ReadToEnd();
            //Crear el Serializador que convertira la cadena Json a Objeto
            JavaScriptSerializer js = new JavaScriptSerializer();
            Usuario usuarioObtenido = js.Deserialize<Usuario>(usuarioJSon);

            return usuarioObtenido;
        }

        public ActionResult Facebook()
        {
            //Obtener Código devuelto por facebook
            if (Request.QueryString.Get("code") != null)
            {
                string code = Request.QueryString.Get("code").ToString();
                if (code != "" && code != null)
                {
                    Usuario usuarioFacebook = procesarLoginFacebook(code) ;
                    if (usuarioFacebook != null)
                    {
                        Models.FormsAuthenticationService autenticador  = new Models.FormsAuthenticationService();
                        autenticador.SignIn(usuarioFacebook.Email, true);
                        return RedirectToAction("Index", "Home");
                    }
                }
            }
            return RedirectToAction("Index");            
        }

        private Usuario UsuarioServ_to_Usuario(ServiceReference1.Usuario usuario) 
        {
            Usuario oUsuario = new Usuario(usuario.Email, usuario.Nombre, usuario.Apellido, usuario.Ocupacion, usuario.Carrera,usuario.Password);
            return oUsuario;
        }

        private List<Usuario> ListarUsuarios() 
        {
            /*
            ServiceReference1.UsuarioClient proxy = new ServiceReference1.UsuarioClient();
            List<ServiceReference1.Usuario> lista_usuario = proxy.listarUsuarios().ToList();

            List<Usuario> Lista_retorna = new List<Usuario>();
            foreach(ServiceReference1.Usuario element in lista_usuario)
            {
                Lista_retorna.Add(UsuarioServ_to_Usuario(element));
            }
            return Lista_retorna;*/

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:50358/Usuario.svc/Usuarios");
            //establecer el metodo
            req.Method = "GET";
            //Recuperar la respuesta
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            //Instanciar un lector
            StreamReader reader = new StreamReader(res.GetResponseStream());
            //Leer la cadena respondida
            string usuariosJSon = reader.ReadToEnd();
            //Crear el Serializador que convertira la cadena Json a Objeto
            JavaScriptSerializer js2 = new JavaScriptSerializer();
            //Recibir la lista
            List<Usuario> lista_usuario = (List <Usuario>)js2.Deserialize(usuariosJSon, typeof(List<Usuario>));

            List<Usuario> Lista_retorna = new List<Usuario>();
            foreach (Usuario element in lista_usuario)
            {
                Lista_retorna.Add(element);
            }
            return Lista_retorna;

        }

        private Usuario ObtenerUsuario(string Email)
        {
            /*
            ServiceReference1.UsuarioClient proxy = new ServiceReference1.UsuarioClient();
            return UsuarioServ_to_Usuario( proxy.obtenerUsuario(Email));*/
            Email = Email.Replace(".", "$punto$");
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:50358/Usuario.svc/Usuarios/"+Email);
            //establecer el metodo
            req.Method = "GET";
            //Recuperar la respuesta
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            //Instanciar un lector
            StreamReader reader = new StreamReader(res.GetResponseStream());
            //Leer la cadena respondida
            string usuarioJSon = reader.ReadToEnd();
            //Crear el Serializador que convertira la cadena Json a Objeto
            JavaScriptSerializer js = new JavaScriptSerializer();
            Usuario usuarioObtenido = js.Deserialize<Usuario>(usuarioJSon);

            return usuarioObtenido;
        }


        //
        // GET: /Usuario/
        //Muestra el listado 
        public ActionResult Index()
        {
            List<Usuario> model = ListarUsuarios();
            return View(model);
        }

        private List<Usuario> ListarCursosXUsuario()
        {
            ServiceReference1.UsuarioClient proxy = new ServiceReference1.UsuarioClient();
            List<ServiceReference1.Usuario> lista_usuario = proxy.listarUsuarios().ToList();
            List<Usuario> Lista_retorna = new List<Usuario>();
            foreach (ServiceReference1.Usuario element in lista_usuario)
            {
                Lista_retorna.Add(UsuarioServ_to_Usuario(element));
            }
            return Lista_retorna;
        }

        //
        // GET: /Usuario/
        //Muestra el listado 
        public ActionResult CursosXUsuario()
        {
            List<Usuario> model = ListarCursosXUsuario();
            return View(model);
        }
        //
        // GET: /Usuario/Details/5
        //Muestra página con los datos de un usuario
        public ActionResult Details(string id)
        {
            Usuario model = ObtenerUsuario(id);
            return View(model);
        }

        //
        // GET: /Usuario/Create
        //Muestra el formulario para llenar los datos del nuevo usuario
        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Usuario/Create
        //Recibe el formuario y guarda el usuario en el repositorio de datos.
        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                /*ServiceReference1.UsuarioClient proxy = new ServiceReference1.UsuarioClient();
                proxy.crearUsuario((string)collection["Email"], (string)collection["Password"], (string)collection["Nombre"], (string)collection["Apellido"], (string)collection["Ocupacion"], (string)collection["Carrera"]);                
                return RedirectToAction("Index");*/

                string postdata = "{\"Email\":\"" + (string)collection["Email"] + "\",\"Password\":\"" + (string)collection["Password"] + "\",\"Nombre\":\"" + (string)collection["Nombre"] + "\", \"Apellido\":\"" + (string)collection["Apellido"] + "\", \"Ocupacion\":\"" + (string)collection["Ocupacion"] + "\",\"Carrera\":\"" + (string)collection["Carrera"] + "\"}"; //JSON
                byte[] data = Encoding.UTF8.GetBytes(postdata);
                HttpWebRequest req = (HttpWebRequest)WebRequest
                   .Create("http://localhost:50358/Usuario.svc/Usuarios");
                req.Method = "POST";
                req.ContentLength = data.Length;
                req.ContentType = "application/json";
                var reqStream = req.GetRequestStream();
                reqStream.Write(data, 0, data.Length);
                var res = (HttpWebResponse)req.GetResponse();
                StreamReader reader = new StreamReader(res.GetResponseStream());
                /*string usuarioJson = reader.ReadToEnd();
                JavaScriptSerializer js = new JavaScriptSerializer();
                Usuario usuarioCreado = js.Deserialize<Usuario>(usuarioJson);
                */
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
        
        //
        // GET: /Usuario/Edit/5
        //Muestra formulario con los datos del usuario a editar
        public ActionResult Edit(string id)
        {
            Usuario model = ObtenerUsuario(id);
            return View(model);
        }

        //
        // POST: /Usuario/Edit/5
        //Recibe formulario y realiza actualizacion de los datos
        [HttpPost]
        public ActionResult Edit(string id, FormCollection collection)
        {
            try
            {
                /*Usuario oUsuario = ObtenerUsuario(id);
                oUsuario.Nombre = collection["Nombre"];
                oUsuario.Apellido = collection["Apellido"];
                oUsuario.Ocupacion = collection["Ocupacion"];
                oUsuario.Carrera = collection["Carrera"];
                ServiceReference1.UsuarioClient proxy = new ServiceReference1.UsuarioClient();
                proxy.modificarUsuario(id, oUsuario.Password, oUsuario.Nombre, oUsuario.Apellido, oUsuario.Ocupacion, oUsuario.Carrera);
                return RedirectToAction("Index");*/

                string postdata = "{\"Email\":\"" + (string)collection["Email"] + "\",\"Password\":\"" + (string)collection["Password"] + "\",\"Nombre\":\"" + (string)collection["Nombre"] + "\", \"Apellido\":\"" + (string)collection["Apellido"] + "\", \"Ocupacion\":\"" + (string)collection["Ocupacion"] + "\",\"Carrera\":\"" + (string)collection["Carrera"] + "\"}"; //JSON
                byte[] data = Encoding.UTF8.GetBytes(postdata);
                HttpWebRequest req = (HttpWebRequest)WebRequest
                    .Create("http://localhost:50358/Usuario.svc/Usuarios/Modificacion");
                req.Method = "POST";
                req.ContentLength = data.Length;
                req.ContentType = "application/json";
                var reqStream = req.GetRequestStream();
                reqStream.Write(data, 0, data.Length);
                var res = (HttpWebResponse)req.GetResponse();
                StreamReader reader = new StreamReader(res.GetResponseStream());
                /*string usuarioJson = reader.ReadToEnd();
                JavaScriptSerializer js = new JavaScriptSerializer();
                Usuario usuarioCreado = js.Deserialize<Usuario>(usuarioJson);
                */
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Usuario/Delete/5
        //Este procedimiento muestra confirmación para la eliminación
        public ActionResult Delete(string id)
        {
            Usuario oUsuario = ObtenerUsuario(id);
            return View(oUsuario);
        }

        //
        // POST: /Usuario/Delete/5
        //Este procedimiento Realiza la eliminacion
        [HttpPost]
        public ActionResult Delete(string id, FormCollection collection)
        {
            try
            {
                /*ServiceReference1.UsuarioClient proxy = new ServiceReference1.UsuarioClient();
                proxy.eliminarUsuario(id);*/

                id = id.Replace(".", "$punto$");
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:50358/Usuario.svc/Usuarios/Eliminacion/"+id);
                req.Method = "POST";                
                HttpWebResponse res = (HttpWebResponse)req.GetResponse();
                                                   
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

    }
}
